package com.eva.databuilder.biz;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.eva.databuilder.builders.AbstractTemplateDataBuilder;
import com.eva.databuilder.biz.dto.BuildTemplateDataDTO;
import com.eva.dao.cms.model.CmsCategory;
import com.eva.dao.cms.model.CmsTemplate;
import com.eva.databuilder.bo.TemplateDataParameters;
import com.eva.databuilder.bo.TemplatePresetDataList;
import com.eva.databuilder.enums.TemplateModuleEnum;
import com.eva.framework.common.utils.AssertUtil;
import com.eva.service.cms.CmsCategoryService;
import com.eva.service.cms.CmsTemplateService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
public class TemplateDataBiz {

    @Resource
    private CmsTemplateService cmsTemplateService;

    @Resource
    private CmsCategoryService cmsCategoryService;

    /**
     * 构建模板数据
     *
     * @param dto 构建参数
     * @return Map<String, Object>
     */
    public Map<String, Object> build (BuildTemplateDataDTO dto) {
        // 根据文件路径查询模板
        CmsTemplate template = cmsTemplateService.findByPath(dto.getPath());
        AssertUtil.notNull(template, "未找到模板");
        // 获取目标数据预设的参数
        JSONObject presetTemplateParametersJson = null;
        CmsCategory category = null;
        if (TemplateModuleEnum.CATEGORY.name().equals(dto.getTargetType())) {
            category = cmsCategoryService.findByUid(String.valueOf(dto.getTargetUid()));
            AssertUtil.notNull(category, "未找到栏目");
            if (StringUtils.isNotBlank(category.getTemplateParameters())) {
                presetTemplateParametersJson = JSON.parseObject(category.getTemplateParameters());
            }
        }
        // 获取模板的预设数据项配置（包含数据项编码、获取数据的参数）
        TemplatePresetDataList presetDataList = new TemplatePresetDataList();
        List<String> dataCodes = Arrays.stream(template.getPresetDataCodes().split(","))
                .filter(StringUtils::isNotBlank)
                .collect(Collectors.toList());
        // 循环预设数据的编码，逐一组装预设数据的配置
        for (String dataCode : dataCodes) {
            TemplatePresetDataList.TemplatePresetData presetData = new TemplatePresetDataList.TemplatePresetData();
            presetData.setCode(dataCode);
            // 获取当前数据项在目标数据的预设参数
            List<TemplateDataParameters.PresetParameter> targetPresetParameters = null;
            if (presetTemplateParametersJson != null) {
                String parameters = presetTemplateParametersJson.getString(dataCode);
                try {
                    targetPresetParameters = JSONArray.parseArray(parameters, TemplateDataParameters.PresetParameter.class);
                } catch (Exception e) {
                    if (TemplateModuleEnum.CATEGORY.name().equals(dto.getTargetType())) {
                        throw new RuntimeException("栏目 " + category.getTitle() + " 预设的模板参数不正确，请编辑栏目的模板参数！");
                    }
                    throw new RuntimeException("目标数据预设的参数不正确");
                }
            }
            presetData.setParameters(dto.getParameters(), targetPresetParameters);
            presetDataList.add(presetData);
        }
        // 通过预设数据的配置列表，逐一构建模板数据
        return AbstractTemplateDataBuilder.build(presetDataList);
    }
}
